package sad.controle;

import sad.util.Constantes;
import java.awt.event.ActionEvent;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Vector;
import sad.dao.DAO;
import sad.dao.QuestaoDAO;
import sad.dao.QuestaoTableDAO;
import sad.dao.SubTopicoTableDAO;
import sad.modelo.Questao;
import sad.modelo.SubTopico;
import sad.util.DAOEvent;
import sad.visao.CadQuestaoDialog;
import sad.visao.DialogAbstrato;
import sad.visao.FabricaDeDialog;

public class QuestaoControle extends AbstractControl {

  private CadQuestaoDialog v_questao;

  public QuestaoControle(DialogAbstrato v) {
    this.v_questao = (CadQuestaoDialog)v;
    addOuvinte();
    initComponents();
  }
  
// <editor-fold defaultstate="collapsed" desc="Responde a eventos com origem nas visões">
    @Override
    public void actionPerformed(ActionEvent e) {
        
        if(e.getActionCommand().equals(Constantes.NOVA_ALTERNATIVA)){
                FabricaDeDialog.criarDialog(null, Constantes.ALTERNATIVA, null);
            }
        if(e.getActionCommand().equals(Constantes.SALVAR_QUESTAO)){
            createQuestao();
        }else {
            if(e.getActionCommand().equals(Constantes.EXCLUIR)){
                int i = QuestaoTableDAO.getInstance().getIndexQuestao();
                removeQuestao(i);
            }
            if(e.getActionCommand().equals(Constantes.UPDATE)){
                int i = QuestaoTableDAO.getInstance().getIndexQuestao();
                updateQuestao(i);
            }
            QuestaoDAO.getInstance().removeDAOOuvinte(this);
            v_questao.close();
        }
    }

    @Override
    public void windowClosed(WindowEvent e){
        switch(e.getID()){
           case WindowEvent.WINDOW_CLOSING:
                QuestaoDAO.getInstance().removeDAOOuvinte(this);
                
                DAO.closeObjectContainer();
                v_questao.close();
                break;
        }
    }// </editor-fold>

// <editor-fold defaultstate="collapsed" desc="Enchaminha eventos com origem no DAO">
    @Override
    public void daoChange(DAOEvent e) {
           v_questao.modelDAOChange(e);
    }// </editor-fold>

    private void addOuvinte() {
        v_questao.addActionListener(this);
        QuestaoDAO.getInstance().addDAOOuvinte(this);
    }

    @SuppressWarnings("static-access")
    private void createQuestao() {
            String fonte  = v_questao.getFonte();
            String enunciado = v_questao.getEnuciado();
            String justificativa = v_questao.getJustificativa();
            String subTopico = v_questao.getSubTopico();
            ArrayList listaAlternativa = v_questao.getListaAlternativa();
            
            if(verificarOK(fonte, subTopico, enunciado, listaAlternativa, justificativa)) {
                SubTopico sTop = SubTopicoTableDAO.getInstance().getSubTopicoSaved(subTopico);
                QuestaoTableDAO.getInstance().create(fonte, enunciado, justificativa, sTop, listaAlternativa);
            }  
     }
    private void removeQuestao(int i) {
        QuestaoTableDAO.getInstance().removeQuestao(i);
    }

    private void updateQuestao(int i) {
            String fonte  = v_questao.getFonte();
            String enunciado = v_questao.getEnuciado();
            String justificativa = v_questao.getJustificativa();
            String subTopico = v_questao.getSubTopico();
            ArrayList listaAlternativa = v_questao.getListaAlternativa();
            
            if(verificarOK(fonte, subTopico, enunciado, listaAlternativa, justificativa)){
                SubTopico sTop = SubTopicoTableDAO.getSubTopicoSaved(subTopico);
                Questao q = QuestaoTableDAO.getQuestaoSaved(enunciado);
                q.setFonte(fonte);
                q.setEnunciado(enunciado);
                q.setJustificativa(justificativa);
                q.setSubTopico(sTop);
                q.setAlternativa(listaAlternativa);
                QuestaoTableDAO.getInstance().update(q, i);
            }
    }

    private boolean verificarOK(String fonte, String subTopico, String enunci,
            ArrayList listaAlternativa, String justificativa) {
            boolean ok=false;
            if (fonte.equals("")){
                QuestaoDAO.getInstance().erroField(fonte, Constantes.FONTE_QUESTAO);
            }else {
                if (enunci.equals("")){
                    QuestaoDAO.getInstance().erroField(enunci, Constantes.ENUNCIADO_QUESTAO);
                }else{
                     if (justificativa.equals("")){
                     QuestaoDAO.getInstance().erroField(justificativa, Constantes.JUSTIFICATIVA_QUESTAO);
                }else{
                      if (subTopico.equals("Lista Vazia")){
                           QuestaoDAO.getInstance().erroField(subTopico, Constantes.SUBTOPICO);
                      }else{
                          //if (listaAlternativa == null){
                           //QuestaoDAO.getInstance().erroField(subTopico, Constantes.SUBTOPICO);
                      //}else{
                            ok = true;   
                          }
                    }  
                }
            }
            return ok;
    }

    private void initComponents() {
       Object[] listObjects = DAO.getListObjects(SubTopico.class);
       Vector<String> p = new Vector<String>();
       if (listObjects.length!=0){
           for (int i = 0; i < listObjects.length; i++) {
                SubTopico sTop = (SubTopico) listObjects[i];
                p.add(sTop.getNome());
           }
           v_questao.reload(p);
       }
    }
}
